package com.zr.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.zr.constant.MessageConstant;
import com.zr.dao.MemberDao;
import com.zr.dao.OrderDao;
import com.zr.dao.OrderSettingDao;
import com.zr.entity.Result;
import com.zr.pojo.Member;
import com.zr.pojo.Order;
import com.zr.pojo.OrderSetting;
import com.zr.service.OrderService;
import com.zr.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @auther zhaorui
 * @date 2019-12-01 - 14:57
 */


@Service(interfaceClass = OrderService.class)
@Transactional
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderSettingDao orderSettingDao;

    @Autowired
    private MemberDao memberDao;

    @Autowired
    private OrderDao orderDao;
    /**
     * 预约业务
     * 1. 首先判断当前日期是否获设置预约
     *
     * 2. 判断 是否预约满
     *
     * 3. 判断 是否重复预约
     *
     * 4. 判断是否为会员 如果不是自动注册为会员
     *
     * 5. 返回结果
     * @param map
     * @return
     */
    @Override
    public Result order(Map map) throws Exception {
        //1. 判断当前日期是否设置可预约
        String orderDate = (String) map.get("orderDate");
        //调用orderSettingDao接口中的方法 查看当前日期能否被预约
        //需要将orderDate转为日期类型
        OrderSetting orderSetting = orderSettingDao.findOrderSettingByOrderDate(DateUtils.parseString2Date(orderDate));
        if (orderSetting == null){
            return Result.error(MessageConstant.SELECTED_DATE_CANNOT_ORDER);
        }

        //2.  判断 是否预约满
        //根据orderSetting获取到可预约人数 和 已预约人数
        int orderSettingNumber = orderSetting.getNumber();
        int orderSettingReservations = orderSetting.getReservations();
        //如果已预约人数 >=
        if (orderSettingReservations >= orderSettingNumber){
            return Result.error(MessageConstant.ORDER_FULL);
        }

        //3. 判断 是否重复预约
            //首先判断是否是会员 -- > 根据手机号
        String telephone = (String) map.get("telephone");
            //调用memberDao中的方法 查看是否存在此用户
        Member member = memberDao.findByTelephone(telephone);
        if (member != null){
            //如果是会员 查询order表中是否有改会员的预约 根据 三个条件确定
            Integer membersId = member.getId();//membersId 会员id
            Date order_Date = orderSetting.getOrderDate();//预约日期
            int setmealId = Integer.parseInt((String) map.get("setmeal"));//套餐编号
            //将三个条件封装到order对象中
            Order order = new Order(membersId, order_Date,null,null,setmealId);
            //调用orderDao中的方法 查询符合条件的数据
            List<Order> list = orderDao.findByCondition(order);
            //如果长度  > 0 则说明已经预约过了
            if (list.size() > 0 && list != null){
                return Result.error(MessageConstant.HAS_ORDERED);
            }

        }

        //可以预约 已预约人数+1  更新对应的orderSetting表
        orderSetting.setReservations(orderSetting.getReservations()+1);
        orderSettingDao.updateOrderSettingByDate(orderSetting);
        if (member == null){
            member =  new Member();
            //4. 如果不是会员 则自动注册会员   尽可能添加人数
            //获取注册会员需要的信息 封装到member对象中
            //身份证号码
            String idCard = (String) map.get("idCard");
            //手机号
            //姓名
            String name = (String) map.get("name");
            //性别
            String sex = (String) map.get("sex");
            //RegTime
            member.setName(name);
            member.setIdCard(idCard);
            member.setPhoneNumber(telephone);
            member.setRegTime(new Date());
            member.setSex(sex);
            memberDao.add(member);
        }
        //5. 保存到order表中
            //将map转为order
        Order order = new Order(member.getId(),
                                DateUtils.parseString2Date(orderDate),
                                (String)map.get("orderType"),
                                Order.ORDERSTATUS_NO,
                                Integer.parseInt((String)map.get("setmealId")));
        //调用方法 添加
        orderDao.add(order);
        return Result.ok(MessageConstant.ORDER_SUCCESS,order.getId());
    }

    @Override
    public Map findById(Integer id) throws Exception {
        Map map = orderDao.findById4Detail(id);
        if (map != null){
            //页面上的日期  取出的数据是西方的格式
            Date orderDate = (Date) map.get("orderDate");
            //转为yyyy-MM-dd
            map.put("orderDate",DateUtils.parseDate2String(orderDate));
        }
        return map;
    }
}
